package com.dong.designPattern.proxy.factort;

import org.assertj.core.internal.cglib.proxy.Enhancer;
import org.assertj.core.internal.cglib.proxy.MethodInterceptor;
import org.assertj.core.internal.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 主要作用就是生成代理类，使用CGLib动态代理技术实现，它是基于继承的方式实现的
 */
public class CgLibProxyFactory implements MethodInterceptor {

    public Object getProxy(Class clazz) {
        // 创建增强器
        Enhancer enhancer = new Enhancer();
        // 设置需要增强的类的类对象
        enhancer.setSuperclass(clazz);
        // 设置回调函数
        enhancer.setCallback(this);
        // 获取增强之后的代理对象
        return enhancer.create();
    }

    /**
     * @param proxy       代理对象，也就是【目标对象】的子类
     * @param method      【目标对象】的方法
     * @param args        参数
     * @param methodProxy 代理对象的方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        /*
         * 因为代理对象是目标对象的子类
         * 该行代码，实际调用的是父类目标对象的方法
         */
        System.out.println("这是cglib的动态代理方法");
        // 通过调用子类【代理类】的invokeSuper方法，去实际调用【目标对象】的方法
        Object returnValue = methodProxy.invokeSuper(proxy, args);
        // 代理对象调用代理对象的invokeSuper方法，而invokeSuper方法会去调用目标类的invoke方法
        return returnValue;
    }
}
